/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.pedidos.servidor.dao;

import br.com.pedidos.servidor.entity.Mesa;
import br.com.pedidos.servidor.entity.Pedido;
import br.com.pedidos.servidor.util.Constantes;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author Weslley
 */
public class PedidoDAO extends BaseDAO<Pedido> {

    @Deprecated
    public List<Pedido> recuperaPedidosPendentesPorMesa(Mesa mesa) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id AND pedido.status = :status");
        query.setParameter("id", mesa.getNumero());
        query.setParameter("status", Constantes.PENDENTE);

        return (List<Pedido>) query.getResultList();
    }    

    public Pedido buscaPorId(Long id) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.id = :id");
        query.setParameter("id", id);

        return (Pedido) query.getSingleResult();
    }
    
    public List<Pedido> buscaPedidosAguardandoConta() {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.status = :status AND pedido.tipo = :tipo");
        query.setParameter("status", Constantes.AGUARDO_CONTA);
        query.setParameter("tipo", Constantes.PEDIDO_CONTA);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> buscaPedidosPendentes() {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.status = :status AND pedido.tipo = :tipo");
        query.setParameter("status", Constantes.PENDENTE);
        query.setParameter("tipo", Constantes.PEDIDO_PRODUTO);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> buscaPedidosEmPreparo() {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.status = :status AND pedido.tipo = :tipo");
        query.setParameter("status", Constantes.EM_PREPARO);
        query.setParameter("tipo", Constantes.PEDIDO_PRODUTO);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> buscaPedidosPronto() {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.status = :status AND pedido.tipo = :tipo");
        query.setParameter("status", Constantes.PRONTO);
        query.setParameter("tipo", Constantes.PEDIDO_PRODUTO);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> buscaPedidosEmPreparoEProntoPorMesa(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE (pedido.status = :status1 OR pedido.status = :status2) AND pedido.tipo = :tipo AND pedido.mesa.numero = :numero");
        query.setParameter("status1", Constantes.EM_PREPARO);
        query.setParameter("status2", Constantes.PRONTO);
        query.setParameter("numero", numero);
        query.setParameter("tipo", Constantes.PEDIDO_PRODUTO);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> recuperaPedidosAtendidosPorMesa(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id AND pedido.status = :status");
        query.setParameter("id", numero);
        query.setParameter("status", Constantes.PRONTO);

        return (List<Pedido>) query.getResultList();
    }
    
    public List<Pedido> recuperaPedidosAtendidosProntosEPendentesPorMesa(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id AND pedido.tipo = :tipo "
                        + "AND (pedido.status = :status1 OR pedido.status = :status2 OR pedido.status = :status3)");
        query.setParameter("id", numero);
        query.setParameter("tipo", Constantes.PEDIDO_PRODUTO);
        query.setParameter("status1", Constantes.PRONTO);
        query.setParameter("status2", Constantes.EM_PREPARO);
        query.setParameter("status3", Constantes.PENDENTE);

        return (List<Pedido>) query.getResultList();
    }
    
    /**
     * Retorna uma lista de pedidos que estão vinculados a conta em aberto.
     *
     * @param numero
     * @return
     */
    public List<Pedido> recuperaListaPedidoPorMesaAberta(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id AND pedido.status <> :status1 AND pedido.status <> :status2");
        query.setParameter("id", numero);
        query.setParameter("status1", Constantes.ENCERRADO_CANCELADO);
        query.setParameter("status2", Constantes.ENCERRADO_ATENDIDO);

        return (List<Pedido>) query.getResultList();
    }

    @Deprecated
    public List<Pedido> recuperaListaPedidoPorMesa(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id");
        query.setParameter("id", numero);

        return (List<Pedido>) query.getResultList();
    }

    public boolean verificaTodosPedidosCancelados(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :id AND pedido.status <> :status1 AND pedido.status <> :status2");
        query.setParameter("id", numero);
        query.setParameter("status1", Constantes.ENCERRADO_CANCELADO);
        query.setParameter("status2", Constantes.ENCERRADO_ATENDIDO);

        boolean todosCancelados = true;
        
        for (Pedido p : (List<Pedido>) query.getResultList()) {
            if (p.getStatus().equalsIgnoreCase(Constantes.CANCELADO)) {
                
            } else {
                todosCancelados = false;
                break;
            }
        }
        return todosCancelados;
    }
    
    public boolean verificaPedidoContaAbertoPorMesa(int numero) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.mesa.numero = :numero AND pedido.status = :status AND pedido.tipo = :tipo");
        query.setParameter("status", Constantes.AGUARDO_CONTA);
        query.setParameter("tipo", Constantes.PEDIDO_CONTA);
        query.setParameter("numero", numero);
        
        return query.getResultList().isEmpty() == true;
    }

    public boolean verificaStatusPedido(Long id) {
        Query query = getEntityManager().createQuery(
                "SELECT pedido FROM " + Pedido.class.getName() + " pedido WHERE pedido.id = :id");
        query.setParameter("id", id);

        Pedido p = (Pedido) query.getSingleResult();

        return p.getStatus().equalsIgnoreCase(Constantes.PENDENTE);
    }

    @Deprecated
    public int getUltimoNumero() {
        try {
            Query query = getEntityManager().createQuery(
                    "SELECT max(numero) FROM " + Pedido.class.getName());

            return (int) query.getSingleResult();
        } catch (Exception e) {
        }
        return 0;
    }

}
